// import com.alibaba.druid.sql.visitor.SQLASTVisitor;

#include "SQLDataTypeRefExpr.h"
#include "../visitor/SQLASTVisitor.h"
#include "SQLDataType.h"

SQLDataTypeRefExpr::SQLDataTypeRefExpr(SQLDataType_ptr dataType)
{
  this->dataType = dataType;
}

SQLDataType_ptr SQLDataTypeRefExpr::getDataType()
{
  return dataType;
}

void SQLDataTypeRefExpr::setDataType(SQLDataType_ptr x)
{
  if (x != nullptr)
  {
    x->setParent(SharedObject(SQLDataTypeRefExpr));
  }
  this->dataType = x;
}

// @Override
bool SQLDataTypeRefExpr::equals(Object_ptr o)
{
  if (this == o.get())
  {
    return true;
  }
  if (o == nullptr || getClass() != o->getClass())
  {
    return false;
  }

  SQLDataTypeRefExpr_ptr that = std::dynamic_pointer_cast<SQLDataTypeRefExpr>(o);

  return dataType != nullptr ? dataType->equals(that->dataType) : that->dataType == nullptr;
}

// @Override
int SQLDataTypeRefExpr::hashCode()
{
  return dataType != nullptr ? dataType->hashCode() : 0;
}

// @Override
void SQLDataTypeRefExpr::accept0(SQLASTVisitor_ptr v)
{
  if (v->visit(SharedObject(SQLDataTypeRefExpr)))
  {
    acceptChild(v, dataType);
  }
  v->endVisit(SharedObject(SQLDataTypeRefExpr));
}

// @Override
SQLObject_ptr SQLDataTypeRefExpr::clone()
{
  dataType == nullptr ? nullptr : dataType->clone();

  SQLObject_ptr clone_tmp = std::shared_ptr<SQLDataTypeRefExpr>(new SQLDataTypeRefExpr(dataType));
  std::shared_ptr<SQLDataTypeRefExpr> x = std::dynamic_pointer_cast<SQLDataTypeRefExpr>(clone_tmp);

  return x;
}
